////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017-2018 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// THIS IS AUTO-GENERATED CODE.  PLEASE DO NOT EDIT (File bug reports against tools).
///
/// Auto-generated by: ParameterParser V1.1.4
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  aecflash.cpp
/// @brief Auto-generated Chromatix parameter file
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include "aecflash.h"
#include "parametersetmanager.h"

AECFLASH_NAMESPACE_BEGIN

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Default Constructor
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
AECFlashTypeClass::AECFlashTypeClass(
    const CHAR* name)
    : ParameterModule(name, MAJOR, MINOR, PATCH, 0, 0, 0, 0)
{
    PARAMETER_INITIALIZE(SymbolTableID);
    PARAMETER_INITIALIZE(module_version);
    PARAMETER_INITIALIZE(flashMtr);
    PARAMETER_INITIALIZE(flashConv);
    PARAMETER_INITIALIZE(flashArb);
    PARAMETER_INITIALIZE(flashExt);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Constructor
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
AECFlashTypeClass::AECFlashTypeClass(
    const CHAR* name,
    UINT32 modeId,
    UINT16 mode,
    UINT16 subMode,
    UINT32 group)
    : ParameterModule(name, MAJOR, MINOR, PATCH, modeId, mode, subMode, group)
{
    PARAMETER_INITIALIZE(SymbolTableID);
    PARAMETER_INITIALIZE(module_version);
    PARAMETER_INITIALIZE(flashMtr);
    PARAMETER_INITIALIZE(flashConv);
    PARAMETER_INITIALIZE(flashArb);
    PARAMETER_INITIALIZE(flashExt);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Destructor
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
AECFlashTypeClass::~AECFlashTypeClass()
{
    UnloadAECFlashType(this);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// GetName
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const CHAR* AECFlashTypeClass::GetName(
    const CHAR* type)
{
    const CHAR* name = type;
    CHAR temp[ParameterFileSymbolTableEntry::TYPE_LEN + 1];
    if (PARAMETER_STRCMP(type, ParameterFileSymbolTableEntry::GetType(temp, "Flash")) == 0)
    {
        name = "Flash";
    }
    return name;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load LEDMeasurementType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECFlashTypeClass::LoadLEDMeasurementType(
    ParameterFileSymbolTableEntry* entry,
    LEDMeasurementType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadFloat(&structure->frameErrAllowance);
    result = result && entry->ReadInt32(&structure->numOfFrames);
    result = result && entry->ReadInt32(&structure->maxNumOfFrames);
    result = result && entry->ReadInt32(&structure->maxNumOfExtraAttempts);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load LEDRatioOkRangeType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECFlashTypeClass::LoadLEDRatioOkRangeType(
    ParameterFileSymbolTableEntry* entry,
    LEDRatioOkRangeType* structure)
{
    BOOL result = TRUE;
    result = result && aecglobalelements::aecglobalelementsClass::LoadStartEndType(entry, &structure->RGRatioOKRange);
    result = result && aecglobalelements::aecglobalelementsClass::LoadStartEndType(entry, &structure->BGRatioOKRange);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load LEDMixCalibEntryType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECFlashTypeClass::LoadLEDMixCalibEntryType(
    ParameterFileSymbolTableEntry* entry,
    LEDMixCalibEntryType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadInt32(&structure->LEDPowerIndex);
    result = result && entry->ReadInt32(&structure->LEDMixIndex);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load LEDMixCalibType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECFlashTypeClass::LoadLEDMixCalibType(
    ParameterFileSymbolTableEntry* entry,
    LEDMixCalibType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadInt32(&structure->numOfCalibration);
    result = result && entry->ReadBoolean(&structure->enableCornerSampleScreen);

    // Reading structure->calibEntries from the symbol table
    {
        result = result && entry->ReadUInt32(&structure->calibEntriesCount);
        structure->calibEntriesID = entry->ID;
        ParameterFileSymbolTableEntry* pointerEntry1 = entry->Table->ReadPointerEntry(entry);
        result = result && pointerEntry1 != NULL;
        if (result)
        {
            structure->calibEntries   = PARAMETER_NEW LEDMixCalibEntryType[structure->calibEntriesCount];
        }
        if (!result || structure->calibEntries == NULL)
        {
            structure->calibEntriesCount = 0;
        }
        for (UINT32 i = 0; result && i < structure->calibEntriesCount; i++)
        {
            result = result && LoadLEDMixCalibEntryType(pointerEntry1, &structure->calibEntries[i]);
        }
    }

    // Reading structure->statsRatioOKRange from the symbol table
    {
        result = result && entry->ReadUInt32(&structure->statsRatioOKRangeCount);
        structure->statsRatioOKRangeID = entry->ID;
        ParameterFileSymbolTableEntry* pointerEntry1 = entry->Table->ReadPointerEntry(entry);
        result = result && pointerEntry1 != NULL;
        if (result)
        {
            structure->statsRatioOKRange   = PARAMETER_NEW LEDRatioOkRangeType[structure->statsRatioOKRangeCount];
        }
        if (!result || structure->statsRatioOKRange == NULL)
        {
            structure->statsRatioOKRangeCount = 0;
        }
        for (UINT32 i = 0; result && i < structure->statsRatioOKRangeCount; i++)
        {
            result = result && LoadLEDRatioOkRangeType(pointerEntry1, &structure->statsRatioOKRange[i]);
        }
    }

    // Reading structure->fixedExpIndex from the symbol table
    {
        result = result && entry->ReadUInt32(&structure->fixedExpIndexCount);
        structure->fixedExpIndexID = entry->ID;
        ParameterFileSymbolTableEntry* pointerEntry1 = entry->Table->ReadPointerEntry(entry);
        result = result && pointerEntry1 != NULL;
        if (result)
        {
            structure->fixedExpIndex   = PARAMETER_NEW FLOAT[structure->fixedExpIndexCount];
        }
        if (!result || structure->fixedExpIndex == NULL)
        {
            structure->fixedExpIndexCount = 0;
        }
        for (UINT32 i = 0; result && i < structure->fixedExpIndexCount; i++)
        {
            result = result && pointerEntry1->ReadFloat(&structure->fixedExpIndex[i]);
        }
    }

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load LEDMixType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECFlashTypeClass::LoadLEDMixType(
    ParameterFileSymbolTableEntry* entry,
    LEDMixType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadInt32(&structure->LED1Setting);
    result = result && entry->ReadInt32(&structure->LED2Setting);
    result = result && entry->ReadFloat(&structure->RGRatio);
    result = result && entry->ReadFloat(&structure->BGRatio);
    result = result && entry->ReadFloat(&structure->flux);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load LEDMatchTableType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECFlashTypeClass::LoadLEDMatchTableType(
    ParameterFileSymbolTableEntry* entry,
    LEDMatchTableType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadBoolean(&structure->enableDualLED);
    result = result && entry->ReadFloat(&structure->dualLEDIntersectSlope);
    result = result && entry->ReadInt32(&structure->LEDPowerSize);
    result = result && entry->ReadInt32(&structure->LEDMixSize);

    // Reading structure->CCTTables from the symbol table
    {
        result = result && entry->ReadUInt32(&structure->CCTTablesCount);
        structure->CCTTablesID = entry->ID;
        ParameterFileSymbolTableEntry* pointerEntry1 = entry->Table->ReadPointerEntry(entry);
        result = result && pointerEntry1 != NULL;
        if (result)
        {
            structure->CCTTables   = PARAMETER_NEW LEDMixType[structure->CCTTablesCount];
        }
        if (!result || structure->CCTTables == NULL)
        {
            structure->CCTTablesCount = 0;
        }
        for (UINT32 i = 0; result && i < structure->CCTTablesCount; i++)
        {
            result = result && LoadLEDMixType(pointerEntry1, &structure->CCTTables[i]);
        }
    }
    result = result && LoadLEDMixCalibType(entry, &structure->CCTTableCalibration);
    result = result && LoadLEDMeasurementType(entry, &structure->LEDMeasConfig);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load FlashExtensionType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECFlashTypeClass::LoadFlashExtensionType(
    ParameterFileSymbolTableEntry* entry,
    FlashExtensionType* structure)
{
    BOOL result = TRUE;
    result = result && aecglobalelements::aecglobalelementsClass::LoadStartEndType(entry, &structure->flashLuxTrigger);
    result = result && aecglobalelements::aecglobalelementsClass::LoadStartEndType(entry, &structure->flashFDRequestDelayLuxTrigger);
    result = result && LoadLEDMatchTableType(entry, &structure->LEDTable);
    result = result && entry->ReadBoolean(&structure->enableForceAFInLEDOnMode);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load FlashArbitrationType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECFlashTypeClass::LoadFlashArbitrationType(
    ParameterFileSymbolTableEntry* entry,
    FlashArbitrationType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadInt32(&structure->expTableIDPreFlash);
    result = result && entry->ReadInt32(&structure->expTableIDMainFlash);
    result = result && entry->ReadInt32(&structure->expTableIDFlashMeasurement);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load TorchConvType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECFlashTypeClass::LoadTorchConvType(
    ParameterFileSymbolTableEntry* entry,
    TorchConvType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadBoolean(&structure->enableTorchConvergence);
    result = result && entry->ReadInt32(&structure->tolMultUnitStepSize);
    structure->frameSkipMethod = (aecglobalelements::ConvFrameSkipType)entry->ReadEnum(&result);
    result = result && entry->ReadFloat(&structure->aggressiveness);
    result = result && entry->ReadFloat(&structure->startupAggressiveness);
    result = result && entry->ReadFloat(&structure->ADRCConvSpeed);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load PreFlashConvergenceType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECFlashTypeClass::LoadPreFlashConvergenceType(
    ParameterFileSymbolTableEntry* entry,
    PreFlashConvergenceType* structure)
{
    BOOL result = TRUE;
    structure->frameSkipMethod = (aecglobalelements::ConvFrameSkipType)entry->ReadEnum(&result);
    result = result && entry->ReadFloat(&structure->aggressiveness);
    result = result && entry->ReadInt32(&structure->settledFrameCountThres);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load FlashConvergenceType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECFlashTypeClass::LoadFlashConvergenceType(
    ParameterFileSymbolTableEntry* entry,
    FlashConvergenceType* structure)
{
    BOOL result = TRUE;
    result = result && LoadPreFlashConvergenceType(entry, &structure->preflashConv);
    result = result && aecglobalelements::aecglobalelementsClass::LoadRapidConvType(entry, &structure->flashMeasurementConv);
    result = result && LoadTorchConvType(entry, &structure->torchConv);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load AECFaceDetectionFlashType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECFlashTypeClass::LoadAECFaceDetectionFlashType(
    ParameterFileSymbolTableEntry* entry,
    AECFaceDetectionFlashType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadBoolean(&structure->enableFDFlash);
    result = result && aecglobalelements::aecglobalelementsClass::LoadStartEndType(entry, &structure->ledFaceWeight);
    result = result && aecglobalelements::aecglobalelementsClass::LoadStartEndType(entry, &structure->ledFaceSize);
    result = result && entry->ReadInt32(&structure->FDFlashFrameCount);
    result = result && entry->ReadFloat(&structure->FDFlashLumaTarget);
    result = result && aecglobalelements::aecglobalelementsClass::LoadStartEndType(entry, &structure->faceSizeExpEffect);
    result = result && entry->ReadFloat(&structure->statsUpdateDelayTimeEnter);
    result = result && entry->ReadFloat(&structure->statsUpdateDelayTimeExit);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load FlashStatsPreprocessingType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECFlashTypeClass::LoadFlashStatsPreprocessingType(
    ParameterFileSymbolTableEntry* entry,
    FlashStatsPreprocessingType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadInt32(&structure->thresBrightLevelDiff);
    result = result && entry->ReadInt32(&structure->thresBrightLevel);
    result = result && entry->ReadFloat(&structure->thresBrightSatDiff);
    result = result && entry->ReadFloat(&structure->thresBrightSat);
    result = result && entry->ReadInt32(&structure->minLuma);
    result = result && entry->ReadFloat(&structure->minLumaAdj);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load SmartFlashType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECFlashTypeClass::LoadSmartFlashType(
    ParameterFileSymbolTableEntry* entry,
    SmartFlashType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadBoolean(&structure->enableSmartFlashEst);
    result = result && entry->ReadFloat(&structure->smartFlashEstStrength);
    result = result && entry->ReadInt32(&structure->minOffStats);
    result = result && entry->ReadFloat(&structure->kFloorPct);
    result = result && entry->ReadFloat(&structure->satPreventStrength);
    result = result && entry->ReadBoolean(&structure->enableSpeckleHandling);
    result = result && aecglobalelements::aecglobalelementsClass::LoadStartEndType(entry, &structure->speckleSatPctRange);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load FlashLumaTargetType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECFlashTypeClass::LoadFlashLumaTargetType(
    ParameterFileSymbolTableEntry* entry,
    FlashLumaTargetType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadBoolean(&structure->enableFlashTarget);
    result = result && aecglobalelements::aecglobalelementsClass::LoadLuxLumaTargetType(entry, &structure->flashTarget);
    result = result && aecglobalelements::aecglobalelementsClass::LoadStartEndType(entry, &structure->flashInfluenceTargetInterpolation);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load FlashMeteringType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECFlashTypeClass::LoadFlashMeteringType(
    ParameterFileSymbolTableEntry* entry,
    FlashMeteringType* structure)
{
    BOOL result = TRUE;
    result = result && LoadFlashLumaTargetType(entry, &structure->flashLumaTarget);
    result = result && LoadSmartFlashType(entry, &structure->smartFlash);
    result = result && LoadFlashStatsPreprocessingType(entry, &structure->statsPreprocessing);
    result = result && LoadAECFaceDetectionFlashType(entry, &structure->FDFlash);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load AECFlashType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECFlashTypeClass::LoadAECFlashType(
    ParameterFileSymbolTableEntry* entry,
    AECFlashType* structure)
{
    BOOL result = TRUE;
    result = result && Loadmodule_versionStruct(entry, &structure->module_version);
    result = result && LoadFlashMeteringType(entry, &structure->flashMtr);
    result = result && LoadFlashConvergenceType(entry, &structure->flashConv);
    result = result && LoadFlashArbitrationType(entry, &structure->flashArb);
    result = result && LoadFlashExtensionType(entry, &structure->flashExt);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load module_versionStruct
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECFlashTypeClass::Loadmodule_versionStruct(
    ParameterFileSymbolTableEntry* entry,
    AECFlashType::module_versionStruct* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadInt32(&structure->major_revision);
    result = result && entry->ReadInt32(&structure->minor_revision);
    result = result && entry->ReadInt32(&structure->incr_revision);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload LEDMixCalibType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void AECFlashTypeClass::UnloadLEDMixCalibType(
    LEDMixCalibType* structure)
{
    PARAMETER_DELETE[] structure->calibEntries;
    PARAMETER_DELETE[] structure->statsRatioOKRange;
    PARAMETER_DELETE[] structure->fixedExpIndex;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload LEDMatchTableType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void AECFlashTypeClass::UnloadLEDMatchTableType(
    LEDMatchTableType* structure)
{
    PARAMETER_DELETE[] structure->CCTTables;
    UnloadLEDMixCalibType(&structure->CCTTableCalibration);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload FlashExtensionType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void AECFlashTypeClass::UnloadFlashExtensionType(
    FlashExtensionType* structure)
{
    UnloadLEDMatchTableType(&structure->LEDTable);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload FlashLumaTargetType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void AECFlashTypeClass::UnloadFlashLumaTargetType(
    FlashLumaTargetType* structure)
{
    aecglobalelements::aecglobalelementsClass::UnloadLuxLumaTargetType(&structure->flashTarget);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload FlashMeteringType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void AECFlashTypeClass::UnloadFlashMeteringType(
    FlashMeteringType* structure)
{
    UnloadFlashLumaTargetType(&structure->flashLumaTarget);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload AECFlashType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void AECFlashTypeClass::UnloadAECFlashType(
    AECFlashType* structure)
{
    UnloadFlashMeteringType(&structure->flashMtr);
    UnloadFlashExtensionType(&structure->flashExt);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Parse symbol table entry, and return a new object
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ParameterModule* AECFlashTypeClass::Parse(
    ParameterSetManager* manager,
    ParameterFileSymbolTableEntry* entry) const
{
    AECFlashTypeClass* cls = NULL;

    if (PARAMETER_STRCMP(Type, entry->Type) == 0 && Major == entry->Major &&
        Minor == entry->Minor && Patch == entry->Patch)
    {
        cls = PARAMETER_NEW AECFlashTypeClass(GetName(entry->Type), 
            entry->ModeId, entry->Mode, entry->SubMode, entry->Group);
        if (cls != NULL)
        {
            BOOL result = TRUE;

            cls->SymbolTableID = entry->ID;
            cls->ID            = entry->ID;

            result = result && LoadAECFlashType(entry, cls);

            if (!result)
            {
                PARAMETER_DELETE cls;
                cls = NULL;
            }
        }
    }
    return (ParameterModule*)cls;
}


AECFLASH_NAMESPACE_END
